추상 클래스

추상 클래스(Abstract Class)

추상 클래스란?

추상 클래스 특징

추상 클래스 선언

[접근제어자] abstract class ClassName {
	//공통 필드 선언
	
	//추상 메서드 : 메서드의 body인 { } 블록이 없는 메서드
	//상속받은 하위 클래스는  반드시 재정의 (강제구현)
	[접근제어자] abstract ReturnType methodName1();
	
	// 일반 메소드
	[접근제어자] ReturnType methodName2() {
		//실행문 작성
	};
}

추상 메서드

//추상 메서드 : 메서드의 body인 { } 블록이 없는 메서드
//상속받은 하위 클래스는  반드시 재정의 (강제구현)
[접근제어자] abstract ReturnType methodName1();

추상클래스 활용

part 5, 추상 클래스 (Abstract Class)

🚀 추상클래스 활용: 하위 클래스를 제어하는 효과

1. 일반 클래스 상속 (자율적 구현)

👨‍💼 안팀장: "입금과 출금은 모든 예금에 대해 공통이니 내가 구현했습니다. 상속 받아 구현하되 여러분은 각 예금에 맞는 이자 계산만 해 주세요. 문제 없겠죠???"

public class 예금 {
    private int 돈;

    public void 입금(int 돈) { this.돈 += 돈; }
    public void 출금(int 돈) { this.돈 -= 돈; }

    public double 이자() {
        // 예금의 종류에 따라 이자계산 방식이 다름
        // 기본으로 0.0을 return하고 하위 클래스에 자율적으로 맡김 (Override)
        return 0.0;
    }
}
classDiagram
    direction BT
    class 예금 {
        -int 돈
        +입금(int 돈)
        +출금(int 돈)
        +이자() double
    }
    class 일반예금 {
        +이자() double
    }
    class 정기적금 {
        +리자() double
    }
    class 펀드 {
        +benefit() double
    }

    일반예금 --|> 예금 : 완료 !!! (유책임)
    정기적금 --|> 예금 : 완료 !!! (김수석)
    펀드 --|> 예금 : 완료 !!! (박신입)

2. 추상 클래스 상속 (구현 강제)

👨‍💼 안팀장: "입금과 출금은 모든 예금에 대해 공통이니 내가 구현했습니다. 상속 받아 구현하되 여러분은 각 예금에 맞는 이자 계산만 해 주세요."

public abstract class 예금 {
    private int 돈;

    public void 입금(int 돈) { this.돈 += 돈; }
    public void 출금(int 돈) { this.돈 -= 돈; }

    // 추상 메서드: 하위 클래스에서 반드시 구현해야 함
    public abstract double 이자(); 
}
classDiagram
    direction BT
    class 예금 {
        <>
        -int 돈
        +입금(int 돈)
        +출금(int 돈)
        +이자()* double
    }
    class 일반예금 {
        +이자() double
    }
    class 정기적금 {
        +리자() double
    }
    class 펀드 {
        +benefit() double
    }

    일반예금 --|> 예금 : 완료 !!! (유책임)
    정기적금 --|> 예금 : 에러 !!! (김수석)
    펀드 --|> 예금 : 에러 !!! (박신입)

다양한 객체 생성 방법

Calendar calendar = new Calendar();//추상 클래스 자신의 생성자로 객체 생성(에러)
public abstract class Calendar
exteds Object
implements Serializable, Cloneable, Comparable<Calendar>

하위 클래스를 참조하여 상위(추상) 클래스의 객체 생성(다형성, Polymorphism)

Calendar calendar = new GregorianCalendar();
public class GregorianCalendar extends Calendar

자신의 객체를 리턴하는 static method 이용

Calendar calendar = Calendar.getInstance();
static Calendar getInstance(Locale aLocale)
Gets a calendar using the default time zone and specified locale.
static Calendar getInstance(Locale aLocale)
Gets a calendar using the specified time zone and default locale.
static Calendar getInstance(Locale aLocale)
Gets a calendar with the specified time zone and locale.

추상 메서드가 없는 추상 클래스

public abstract class Shape {
    private String color;

    public Shape(String color) {
        this.color = color;
    }

    // 추상 메서드 없음 — 하지만 직접 인스턴스화 불가
    public String getColor() {
        return color;
    }
}

// 가능: 상속 후 사용
public class Circle extends Shape {
    public Circle(String color) {
        super(color);
    }
}

Shape s = new Shape("red");   // 컴파일 에러: 추상 클래스 인스턴스화 불가
Shape c = new Circle("red");  // 가능

인터페이스와의 차이

추상 메서드 없는 추상 클래스 인터페이스
인스턴스화 불가 불가
생성자 가질 수 있음 없음
필드 인스턴스 필드 가능 상수만 가능
상속 강제 없음 없음
다중 구현 불가 (단일 상속) 가능

추상 메서드가 하나도 없는 추상 클래스는 드문 패턴이지만, 상속 계층 설계나 라이브러리에서 직접 사용을 막을 목적으로 간혹 사용된다.